home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stngpasm / pure_c / include / uran / uran_arg.s < prev    next >
Encoding:
Text File  |  1997-08-08  |  4.3 KB  |  176 lines

  1. ;----------------------------------------------------------------------------
  2. ;File name:    URAn_ARG.S            Revision date:    1997.08.08
  3. ;Creator:    Ulf Ronald Andersson        Creation date:    1992.11.30
  4. ;(c)1992 by:    Ulf Ronald Andersson        All rights reserved
  5. ;Released as:    FREEWARE            (commercial sale forbidden)
  6. ;----------------------------------------------------------------------------
  7. ;Purpose:    Code library for ARGV handling
  8. ;----------------------------------------------------------------------------
  9. ;Required header declarations:
  10. ;
  11. ;    include    "uran\STRUCT.SH"
  12. ;    include    "uran\URAn_SYS.SH"
  13. ;    include    "uran\URAn_DOS.SH"
  14. ;
  15. ;    include    "uran\URAn_ARG.S"    ;in some early .TEXT section
  16. ;
  17. ;----------------------------------------------------------------------------
  18. ;Remarks:
  19. ;
  20. ;Required variables:
  21. ;
  22. ;rz        relative zero for internal references
  23. ;basepage_p    -> program's base page
  24. ;
  25. ;NB:    Both these will be defined by including URAn_APP.S
  26. ;
  27. ;Defined variables:
  28. ;
  29. ;arg_cnt    == number of strings on command line
  30. ;arg_ptr    -> NUL_separated argument strings + final NUL
  31. ;
  32. ;NB:    Both of the above include a dummy program name (first string==NUL).
  33. ;----------------------------------------------------------------------------
  34. ;
  35.     text
  36. ;
  37. URAn_ARGV_init:
  38.     lea    rz(pc),a6        ;a6 -> local ref
  39.     move.l    basepage_p(pc),a5    ;a5 -> basepage
  40.     gemdos    Fsetdta,.local_dta(pc)
  41.     moveq    #1,d3            ;argc = 1
  42.     clr    d1
  43.     lea    bp_arglen(a5),a0
  44.     move.b    (a0)+,d1
  45.     cmp    #$7F,d1
  46.     bhs.s    .try_argv_arg
  47. .cmd_line_arg:
  48.     clr    d2            ;unflag separator
  49.     lea    bp_arglen(a5),a3    ;a3 -> arg string (result)
  50.     move.l    a3,a1            ;a1 -> arg string (reconstruction)
  51.     clr    d1
  52.     move.b    (a1),d1            ;d1 = total arg length
  53.     clr.b    (a1)+            ;(a1)+ = dummy name string
  54.     move.l    a1,a0            ;a0 -> arg string (analysis)
  55.     clr.b    (a0,d1)            ;terminate arg string
  56.     clr.b    1(a0,d1)        ;terminate arg group
  57.     tst    d1
  58.     ble    .done_arg        ;exit if no arg
  59. .scan_tail_next_arg:
  60.     move.b    (a0)+,d0
  61.     beq.s    .scan_tail_end
  62.     cmp.b    #' ',d0
  63.     bls.s    .scan_tail_next_arg
  64.     addq    #1,d3            ;increment arg count
  65.     clr    d2            ;unflag separator
  66. .scan_tail_next_char:
  67.     cmp.b    #'"',d0
  68.     beq.s    .scan_tail_quote_1
  69.     cmp.b    #"'",d0
  70.     bne.s    .scan_tail_no_quote
  71. .scan_tail_quote_1:
  72.     move.b    (a0)+,d1
  73.     beq.s    .scan_tail_end
  74.     cmp.b    d0,d1
  75.     bne.s    .scan_tail_quote_2
  76.     cmp.b    (a0),d1
  77.     bne.s    .scan_tail_end_quote
  78.     addq    #1,a0        ;so double quotes give quote-char
  79. .scan_tail_quote_2:
  80.     move.b    d1,(a1)+    ;copy quoted char
  81.     bra.s    .scan_tail_quote_1
  82. ;
  83. .scan_tail_no_quote:
  84.     move.b    d0,(a1)+    ;copy normal char
  85. .scan_tail_end_quote:
  86.     move.b    (a0)+,d0
  87.     beq.s    .scan_tail_end
  88.     cmp.b    #' ',d0
  89.     bhi.s    .scan_tail_next_char
  90.     clr.b    (a1)+        ;change separator from SPC to NUL at destination
  91.     st    d2        ;flag separator
  92.     bra.s    .scan_tail_next_arg
  93. ;
  94. .scan_tail_end:
  95.     clr.b    (a1)        ;terminate arg string
  96.     clr.b    1(a1)        ;terminate arg group
  97. .scan_tail_ended:
  98.     bra    .done_arg
  99. ;
  100. .try_argv_arg:
  101.     move.l    bp_environ_p(a5),a0    ;a0 -> environment strings
  102.     move.l    a0,d0
  103.     beq.s    .cmd_line_arg
  104.     move.b    (a0)+,d0
  105.     beq.s    .scan_env_next_var
  106. .scan_env_1:
  107.     cmp.b    #'A',d0
  108.     bne.s    .scan_env_end_var
  109.     move.b    (a0)+,d0
  110.     beq.s    .scan_env_next_var
  111.     cmp.b    #'R',d0
  112.     bne.s    .scan_env_end_var
  113.     move.b    (a0)+,d0
  114.     beq.s    .scan_env_next_var
  115.     cmp.b    #'G',d0
  116.     bne.s    .scan_env_end_var
  117.     move.b    (a0)+,d0
  118.     beq.s    .scan_env_next_var
  119.     cmp.b    #'V',d0
  120.     bne.s    .scan_env_end_var
  121.     move.b    (a0)+,d0
  122.     beq.s    .scan_env_next_var
  123.     cmp.b    #'=',d0
  124.     bne.s    .scan_env_end_var
  125.     tst.b    (a0)+
  126.     bne.s    .done_arg        ;exit if nonstandard ARGV=
  127.     clr.b    -6(a0)            ;\/ Cut environment
  128.     clr.b    -5(a0)            ;/\ at ARGV= start
  129.     move.l    a0,a3            ;a3 -> first arg string (prog name)
  130.     tst.b    (a0)+
  131.     beq.s    .done_arg
  132. .scan_env_2:
  133.     tst.b    (a0)+
  134.     bne.s    .scan_env_2
  135. .scan_env_3:
  136.     tst.b    (a0)+
  137.     beq.s    .done_arg
  138.     addq    #1,d3
  139. .scan_env_4:
  140.     tst.b    (a0)+
  141.     bne.s    .scan_env_4
  142.     bra.s    .scan_env_3
  143. ;
  144. .scan_env_end_var:
  145.     move.b    (a0)+,d0
  146.     bne.s    .scan_env_end_var
  147. .scan_env_next_var:
  148.     move.b    (a0)+,d0
  149.     bne.s    .scan_env_1
  150.     bra    .cmd_line_arg
  151. ;
  152. .null_str:
  153.     dc.l    0
  154. .local_dta:
  155.     ds.b    44
  156. ;
  157. .done_arg:
  158.     move    d3,d0
  159.     bne.s    .keep_arg
  160.     lea    .null_str(pc),a3
  161. .keep_arg:
  162.     move.l    a3,a0
  163.     move.l    a3,arg_ptr-rz(a6)
  164.     move    d0,arg_cnt-rz(a6)
  165.     bra.s    URAn_ARGV_exit
  166. ;
  167. arg_cnt:
  168.     dc.w    0
  169. arg_ptr:
  170.     dc.l    0
  171. ;
  172. URAn_ARGV_exit:
  173. ;----------------------------------------------------------------------------
  174. ;    End of file:    URAn_ARG.S
  175. ;----------------------------------------------------------------------------
  176.